import {
  getItem,
  getItemFromSession,
  removeItem,
  setItem,
  setItemFromSession,
} from "@/utils/storage";
import Vue from "vue";
import Vuex from "vuex";
// 引入base64对密码进行加密
const Base64 = require("js-base64").Base64;

Vue.use(Vuex);

export default new Vuex.Store({
  state: {
    // 先从sessionStorage中取token，sessionStorage中没有再从localStorage中取
    user: getItemFromSession("token") || getItem("token"),
  },
  getters: {
    password() {
      try {
        const password = getItem("password");
        if (password) {
          return Base64.decode(password);
        }
        return "";
      } catch (err) {
        console.log(err);
      }
    },
    userName() {
      try {
        return getItem("userName") || "";
      } catch (err) {
        console.log(err);
      }
    },
  },
  mutations: {
    setUser(state, data) {
      const token = data.token;
      const autoLogin = data.type.autoLogin;
      const remePwd = data.type.remePwd;
      const userName = data.userName;
      const password = data.password;

      // 1. 用户登录成功，保存token到vuex
      state.user = token;

      if (autoLogin) {
        // 2. 判断是否是自动登录
        // 2.1. 是，保存用户名和密码，保存token到本地
        this.commit("saveAccount", { userName, password });
        setItem("token", token);
      } else if (remePwd) {
        // 3. 不是自动登录，判断是否记住密码。
        // 3.1 是,保存用户名密码到本地
        this.commit("saveAccount", { userName, password });
      } else {
        // 4. 既不自动登录、也不记住密码。就都不保存到本地，但是需要要将原先保存的账号密码先清除.
        // 也可以不清除，因为 想保存账号密码的就保存，不想保存账号的密码的就不保存
        removeItem("userName");
        removeItem("password");
        removeItem("token");
      }

      // 由于刷新页面 vuex数据会重新加载，所以需要将token保存到sessionStorage中
      setItemFromSession("token", token);
      setItem("token", token);
    },
    // 保存用户名和密码到本地
    saveAccount(state, { userName, password }) {
      setItem("userName", userName);
      setItem("password", Base64.encode(password));
    },
  },
  actions: {},
  modules: {},
});
